package com.baor.service.impl;

import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baor.dao.MenuDao;

import com.baor.dao.Role_MenuDao;
import com.baor.dao.UserDao;
import com.baor.domain.MenuVO;
import com.baor.domain.Role_MenuVo;
import com.baor.domain.UserVO;
import com.baor.service.MenuService;
import com.baor.util.R;

import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class MenuServiceImpl implements MenuService {
    @Autowired
    private MenuDao menuDao;
    @Autowired
    private Role_MenuDao role_MenuDao;
    @Autowired
    private UserDao userDao;
    @Override
    public R menuList(Integer userId) {
        List<MenuVO> allMenu = new ArrayList<>();
        UserVO userVO = userDao.selectById(userId);
        //TODO 根据userId验证该用户是否为超级管理员
        if(userVO.getIsAdmin().equals("1")){
            allMenu =  this.menuDao.menuList(null);
        }else {
            allMenu = this.menuDao.menuList(userId);
        }
        //TODO 根据用户Id获取用户权限的菜单
     /*   allMenu = this.menuDao.menuList(null);*/
        //获取到了所有的该用户全选所有的菜单
        List<MenuVO> parentMenu = allMenu.stream().filter(x -> x.getParentId().equals(0)).collect(Collectors.toList());
        allMenu.removeAll(parentMenu);
        /* List<MenuVO> finalAllMenu = allMenu;
         parentMenu.forEach(item -> {
            List<MenuVO> child = getChild(item.getId(), finalAllMenu);
            item.setChildList(child);
        });*/
        for(MenuVO menu : parentMenu){
            List<MenuVO> child = getChild(menu.getId(), allMenu);
            menu.setChildList(child);
        }

        return R.ok(parentMenu);
    }

    @Override
    public R insertMenu(MenuVO menu) {
        //TODO  根据路径验证重复
        int insertedRows = menuDao.insert(menu);
        return insertedRows > 0 ? R.ok() : R.er();
    }

    @Override
    public R returnmenu() {

        MPJLambdaWrapper<MenuVO> wrapper = new MPJLambdaWrapper<MenuVO>()
                // 选择需要返回的字段（建议明确指定，而非selectAll()，避免冗余字段）
                .select(MenuVO::getId,
                        MenuVO::getName)
                .eq(MenuVO::getParentId, 0);
        List<MenuVO> menuVOS = menuDao.selectList(wrapper);
        Map<String,Object> map = new HashMap<>();
        map.put("menuParent",menuVOS);
        return R.ok(map);
    }

    @Override
    public R updateMenu(MenuVO menu) {
       LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<MenuVO>()
               .set(MenuVO::getName, menu.getName())
               .set(MenuVO::getPath, menu.getPath())
               .set(MenuVO::getOrders,menu.getOrders())
               .set(MenuVO::getIsLeft,menu.getIsLeft())
               .set(MenuVO::getIcon,menu.getIcon())
               .set(MenuVO::getTitle,menu.getTitle())
               .set(MenuVO::getVisible,menu.getVisible())
               .set(MenuVO::getParentId, menu.getParentId())
               .eq(MenuVO::getId, menu.getId());
       menuDao.update(updateWrapper);



        int insertedRows = menuDao.update(updateWrapper);
        return insertedRows > 0 ? R.ok() : R.er();
    }


    public List<MenuVO> getChild(Integer parentId,List<MenuVO> list){
        List<MenuVO> childMenu = new ArrayList<>();
        list.forEach(item -> {
            if(item.getParentId().equals(parentId)){
                childMenu.add(item);
            }
        });
        for(MenuVO menu : childMenu){
            List<MenuVO> child = getChild(menu.getId(), list);
            menu.setChildList(child);
        }
        return childMenu;
    }
}
